/*
 * ISTY 1
 * Projet IDD
 * Jeu de société Caylus
 *
 * Groupe 9:
 *      Bedhiaf Mouna
 *      Joober Nizar
 *      Labassi Amine
 *      Sridi Med Mahdi
 * Année 2008/2009
 */

package caylus.Model;

import java.util.ArrayList;

import caylus.Enum.PhaseConstructionChateau;
import caylus.GUI.PlateauDuJeu;
import java.io.Serializable;

/**
 * Construire dans le chateau permet d'aboutir au but de ce jeu
 * car ça rapporte des point de prestige et des faveurs du roi
 * Une unique instance de cette classe existe durant toute une partie Caylus
 *
 * @author Groupe 9 ISTY 1
 */
public class Chateau implements Serializable{


    
    public ArrayList<Ouvrier> _ouvriers;
	private ArrayList<Joueur> _donjon;
	private ArrayList<Joueur> _murailles;
	private ArrayList<Joueur> _tours;
	private PhaseConstructionChateau _phaseCC;

    /**
     * A l'initialisation d'une partie, le Croupier cré une unique instance du Chateau
     * Le chateau détient une liste d'ouvriers qui est initialement vide
     * ainsi que trois listes de maisons construites par les joueurs durant la partie
     * La construction du chateau se passe en trois phases
     */
    public Chateau()
	{
		_ouvriers = (new ArrayList<Ouvrier>());
		_donjon = new ArrayList<Joueur>();
		_murailles = new ArrayList<Joueur>();
		_tours = new ArrayList<Joueur>();
        _phaseCC = PhaseConstructionChateau.DONJON;
	}

    /**
     *
     * @return la phase de construction du chateau actuelle
     */
    public PhaseConstructionChateau get_phaseCC() {
        return _phaseCC;
    }

    /**
     * Lors d'une partie, la phase de construction change, et ce changement est fait en utilisant cette méthode
     * @param _phaseCC
     */
    public void set_phaseCC(PhaseConstructionChateau _phaseCC) {
        this._phaseCC = _phaseCC;
    }


    /**
     * Quand un Joueur place son ouvrier sur le chateau cette méthode est évoquée
     * Cet ouvrier est ajouté dans la liste des ouvriers que détient le chateau
     * @param pOuvrier
     */
    public void ajouterOuvrier(Ouvrier pOuvrier)
	{
		if (_ouvriers.size()< 6) _ouvriers.add(pOuvrier);
	}

    /**
     * Supprime un ouvrier du chateau
     * Le joueur propriétaire de cet ouvrier le récupere
     * @param pOuvrier
     */
    public void supprimerOuvrier(Ouvrier pOuvrier)
	{
		_ouvriers.remove(pOuvrier);
	}

    /**
     * En fonction de la phase de construction du chateau, cette méthode place une maison d'un joueur passé en param
     * sur le chateau ( soit Donjon, soit Murailles, soit Tours) et lui accorde les points de prestige correspondant
     *
     * @param pJoueur
     * @param pPlateau
     */
    public void construireDansLeChateau(Joueur pJoueur, PlateauDuJeu pPlateau)
	{
		switch (_phaseCC)
		{
			case DONJON :
                _donjon.add(pJoueur);
                pPlateau._emplacementDonjon.get(pPlateau.ctrDonjon).setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/Ouvriers/"+ pPlateau.convertColorToString(pJoueur.getCouleur() )+".png")));
                pPlateau._emplacementDonjon.get(pPlateau.ctrDonjon).setVisible(true);
                pPlateau.ctrDonjon++;
                pJoueur.set_prestige(pJoueur.getPrestige() + 5);
                if(_donjon.size() == 6)
                    _phaseCC = PhaseConstructionChateau.MURAILLES;
                pJoueur.NbConstructionDonjon++;
                break;
			case MURAILLES :
                _murailles.add(pJoueur);
                pJoueur.set_prestige(pJoueur.getPrestige() + 4);
                if(_murailles.size() == 10)
                    _phaseCC = PhaseConstructionChateau.TOURS;
                pJoueur.NbConstructionMurailles++;
                break;
			case TOURS :
                if(_tours.size() <= 14)
                    _tours.add(pJoueur);
                pJoueur.set_prestige(pJoueur.getPrestige() + 3);
                pJoueur.NbConstructionTours++;
                break;
			default :
                break;
		}
	}
    /**
     *
     * @return le nombre de places encore disponibles sur le chateau
     */
    public int getNbPlacesDisponibles()
    {
        return _ouvriers.size();
    }

}
